/* 
    优先级主要考虑的问题
        1.每个元素不再只是一个数据,而且包含数据的优先级
        2.在添加方式中,根据优先级放入正确的位置

    生活例子:
        *登机顺序
        *急诊科
*/
function PriorityQueue() {
  // 内部类
  function QueueElement(element, priority) {
    this.element = element;
    this.priority = priority;
  }

  this.items = [];

  // 1.按照优先级顺序实现插入方法
  PriorityQueue.prototype.enqueue = function (element, priority) {
    // 1.创建QueueElement对象
    let queueElement = new QueueElement(element, priority);
    // 2.判断队列是否为空
    if (this.items.length === 0) {
      this.items.push(queueElement);
    } else {
      let added = false;
      for (let i = 0; i < this.items.length; i++) {
        if (queueElement.priority < this.items[i].priority) {
          this.items.splice(i, 0, queueElement);
          added = true;
          break;
        }
      }
      if (!added) {
        this.items.push(queueElement);
      }
    }
  };

  // 2.从队列中删除前端元素
  PriorityQueue.prototype.dequeue = function () {
    return this.items.shift();
  };
  // 3.查看队列前端元素
  PriorityQueue.prototype.front = function () {
    return this.items[0];
  };
  // 4.查看队列是否为空
  PriorityQueue.prototype.isEmpty = function () {
    return this.items.length === 0;
  };
  // 5.查看队列中元素的个数
  PriorityQueue.prototype.size = function () {
    return this.items.length;
  };
  // 6.toString()方法
  PriorityQueue.prototype.toString = function () {
    let resultString = '';
    for (let i = 0; i < this.items.length; i++) {
      resultString +=
        this.items[i].element + '-' + this.items[i].priority + ' ';
    }
    return resultString;
  };
}

let pq = new PriorityQueue();
pq.enqueue('aaa', 111);
pq.enqueue('bbb', 200);
pq.enqueue('ccc', 55);
pq.enqueue('ddd', 666);
console.log(pq);
